#!/usr/bin/env tclsh
source streamtestlib.tcl

# Define records, protocol and startup (text goes to files)
# The asynPort "device" is connected to a network TCP socket
# Talk to the socket with send/receive/assure
# Send commands to the ioc shell with ioccmd

set records {
    record (waveform, "DZ:test1")
    {
        field (DTYP, "stream")
        field (FTVL, "DOUBLE")
        field (NELM, "1048576")
        field (INP,  "@test.proto test1 device")
    }
    record (waveform, "DZ:test2")
    {
        field (DTYP, "stream")
        field (FTVL, "LONG")
        field (NELM, "1048576")
        field (INP,  "@test.proto test2 device")
    }
    record (waveform, "DZ:test3")
    {
        field (DTYP, "stream")
        field (FTVL, "STRING")
        field (NELM, "1048576")
        field (INP,  "@test.proto test3 device")
    }
}

set protocol {
    replyTimeout =600000;
    Terminator = LF;
    Separator = " ";
    test1 {in "%f"; out "%(NORD)d";}
    test2 {in "%i"; out "%(NORD)d";}
    test3 {in "%s"; out "%(NORD)d";}
}

set startup {
}

set debug 0

set message "314156"
set size 1
set timeout 600000
set type(1) "double"
set type(2) "long  "
set type(3) "string"

startioc
    send "$message\n"
    process DZ:test1
    assure "$size\n"
    send "$message\n"
    process DZ:test2
    assure "$size\n"
    send "$message\n"
    process DZ:test3
    assure "$size\n"

ioccmd {var streamDebug 0}
for {set log 1} {$log <= 21} {incr log} {
    foreach n { 1 2 3 } {
        send "$message\n"

        # make sure all output is available before we start
        after 100

        set starttime [clock clicks]
        process DZ:test$n
        assure "$size\n"
        set duration [expr [clock clicks] - $starttime]

        set performance($size) [expr $duration*1.0/$size]
        puts [format "%7d %s %9d ticks %9.2f ticks/element" $size $type($n) $duration $performance($size)]
        if {$performance($size) > $performance(1)} {incr faults}
    }
    set message "$message $message"
    set size [expr $size*2]    
}

finish
